/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Engine.Fisica;

import jogopoo.Util.Matematica;
import java.awt.Image;
import java.util.ArrayList;
import jogopoo.Grafico.GrafCenario;
import jogopoo.Personagem.PersonagemRot;

/**
 *Classe que sera extendida pelos objetos que apresentao comportamento fisico
 * de gravitacao.
 * @author Administrador
 */
public class ObjFisico extends PersonagemRot {

    public ObjFisico(GrafCenario cenario, Image[] desenho, float massa) {
        super(cenario, desenho);
        this.velocidadeX = 0;
        this.velocidadeY = 0;
        this.m = massa;
    }
/**
 *Adiciona os vetores que representao as forcas que os planetas atuam sobre o
 * objeto
 * @param modulo
 * @param teta
 * @return
 */
    public int adicionaVetor(double modulo, double teta) {
        Vetor v = new Vetor(modulo, teta);
        lista_vetor.add(v);
        return lista_vetor.size();
    }

    /**
     * Faz calculos necessarios de acordo com a lista de vetores para posicionar
     * o objeto nas coordenadas do instante, ou seja, mover-se
     */
    public void move() {
        for (int i = 0; i < lista_vetor.size(); i++) {
            velocidadeX += lista_vetor.get(i).decompoemX() / m;
            velocidadeY += lista_vetor.get(i).decompoemY() / m;
        }

        posicao.x += velocidadeX;
        posicao.y += -velocidadeY;
    }

    /**
     * Seta o atributo Teta para o angulo resultante das forças aplicadas
     */
    public void TetaSetResult() {
        this.teta = Math.atan(velocidadeY / velocidadeX);
        if (velocidadeX < 0) {
            teta += Math.PI;
        } 
    }

    /**
     * Calcula a força de gravitacao apartir do objeto de parametro para o
     * vetor de indice "indice" que esta no parametro
     */
    public double setForcaG(Planeta planeta, int indice) {
        double d = Matematica.distanciaPers(this, planeta);
        this.lista_vetor.get(indice).setTeta(Matematica.direcaoPonto(posicao.x, posicao.y,
                planeta.getPosicao().x,
                planeta.getPosicao().y));
        if (d != 0 && d > 32) {
            this.lista_vetor.get(indice).setModulo((planeta.getM() * m) / (d * d));
        }
        return d;
    }

    /**
     * Aplica forca Instantanea ao objeto.
     */
    public void aplicaFIntantanea(double modulo, double teta) {
        velocidadeX += modulo * Math.cos(teta);
        velocidadeY += modulo * Math.sin(teta);
    }
    /**
     * Seta o indice (numero do tiro no ArrayList).
     * @param indice
     */
    public void setIndice(int indice) {
        this.indice = indice;
    }
    /**
     * metodo que sera sobreescrito pelas classes que herdarao a fim
     * de especificar as funcionalidades no jogo
     */
    public void atualiza(){
    }
    protected ArrayList<Vetor> lista_vetor = new ArrayList<Vetor>();
    protected double m; //massa
    protected double velocidadeX;
    protected double velocidadeY;
    protected int indice;
}
